//
// Created by HhL on 2021/7/7.
//

#include <assert.h>
#include <stdio.h>
#include <string.h>
#include<stdlib.h>

#ifndef C_STUDY_C_UTILS_H
#define C_STUDY_C_UTILS_H


/**
 * src 拼接到dest上
 * @param dest
 * @param src
 * @return
 */
char* my_strcat(char* dest, const char* src) {

    //指针循环
    assert((dest != NULL) && (src != NULL));
    char* temp = dest;
    while (*dest) {
        dest++;
    }
    while ((*dest++ = *src++) != '\0') {}
    return temp;
}

int my_strlen(const char* str) {
    int i = 0;
    while (*str) {
        str++;
        i++;
    }
    return i;
}

size_t my_strlen1(const char* str) {
    const char* temp = str;
    while (*temp++) {}
    return (temp - str - 1);
}

char* my_strcpy(char* dest, const char* src) {
    //指针循环
    assert((dest != NULL) && (src != NULL));
    char* temp = dest;
    while ((*dest++ = *src++) != '\0') {}
    return temp;
}


char* my_strcpy1(char* dest, const char* src) {
    assert((dest != NULL) && (src != NULL));
    char* temp = dest;
    while ((*temp++ = *src++)) {}
    return dest;
}

//把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
int my_strcmp(const char* s1, const char* s2) {
    const unsigned char* p1 = (const unsigned char*) s1;//重新赋值指针，使其可以处理全部的字符
    const unsigned char* p2 = (const unsigned char*) s2;
    unsigned char c1, c2;
    do {
        c1 = (unsigned char) *p1++;
        c2 = (unsigned char) *p2++;
        if (c1 == '\0') {
            return c1 - c2;
        }
    } while (c1 == c2);
    return c1 - c2;
}

//C 库函数 char *strchr(const char *str, int c) 在参数 str 所指向的字符串中搜索第一次出现字符 c（一个无符号字符）的位置。
char* my_strchr(const char* str, int c) {
    while (*str && (*str != c)) {
        str++;
        if (*str == c) {
            return (char*) str;
        }
    }
    return ((char*) 0);
}

// 借助指针++ 实现
int mystrlen2(char* str) {
    char* p = str;
    while (*p != '\0') {
        p++;
    }
    return p - str;  // 返回数组元素的个数。
}

void write_file(const char* file_name) {
    FILE* fp = fopen(file_name, "w");
    if (!fp)  // fp == NULL
    {
        perror("fopen error");
    }

    fprintf(fp, "%d\n", 10);
    fprintf(fp, "%d\n", 8);
    fprintf(fp, "%d\n", 6);

    fclose(fp);
}

// fgets 循环读文件 返回as码
//fgets遇到“空格”就跟遇到平常的字符一样读取，遇到“回车”则结束本次读取，最后往缓冲区(char *buf[])的最后加多一个"\0"表示本次读取一行结束
void read_file3(const char* file_name) {
    char buf[1024];
    FILE* fp = fopen(file_name, "r");
    if (!fp)  // fp == NULL
    {
        perror("fopen error");
    }
    while (1) {
        memset(buf, 0, 1024);
        fgets(buf, 1024, fp);// 读 \n
        if (feof(fp))        // 真-- 文件结尾
            break;
        printf("%d\n", buf[0]);
    }

    fclose(fp);
}

//循环读取
// fscanf:不论遇到“空格”还是“回车”，都当作'\0'读取到缓冲区中(char  *buf[])，并结束本次读取。
void read_file2_cycle(const char* file_name) {
    int a;
    FILE* fp = fopen(file_name, "r");
    if (!fp)  // fp == NULL
    {
        perror("fopen error");
    }
    while (1) {
        fscanf(fp, "%d\n", &a);  // 读
        printf("%d\n", a);
        if (feof(fp))        // 真-- 文件结尾
            break;
    }

    fclose(fp);
}

void read_file_now(const char* file_name) {
    int a;

    FILE* fp = fopen(file_name, "r");
    if (!fp)  // fp == NULL
    {
        perror("fopen error");
    }

    fscanf(fp, "%d\n", &a);
    printf("%d\n", a);

    fscanf(fp, "%d\n", &a);
    printf("%d\n", a);

    fscanf(fp, "%d\n", &a);
    printf("%d\n", a);

    a = 0;
    fscanf(fp, "%d\n", &a);
    printf("%d\n", a);

    fclose(fp);
}

//获取有效行数
int getFileLines(FILE* pFile) {
    if (pFile == NULL) {
        return -1;
    }

    char buf[1024] = {0};
    int lines = 0;
    while (fgets(buf, 1024, pFile) != NULL) {
        //printf("%s", buf);
        lines++;
    }

    //将文件光标置首
    fseek(pFile, 0, SEEK_SET);
    return lines;

}

void readFileData(FILE* pFile, int len, char** pArray) {
    if (pFile == NULL) {
        return;
    }
    if (len <= 0) {
        return;
    }
    if (pArray == NULL) {
        return;
    }
    char buf[1024] = {0};
    int index = 0;
    while (fgets(buf, 1024, pFile) != NULL) {
        /*
        aaaaaaaaaa
        bbbb
        cccccc
        */
        int currentLen = strlen(buf) + 1;
        char* currentStrP = malloc(sizeof(char) * currentLen);
        strcpy(currentStrP, buf);
        pArray[index++] = currentStrP;
        memset(buf, 0, 1024);
    }

}

void showFileData(char** pArray, int len) {
    for (int i = 0; i < len; i++) {
        printf("%d行的数据为 %s", i + 1, pArray[i]);
    }
}

#endif
